package cn.virens.util.shiro;

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;

/**
 * 基础权限类型
 * @文件 :Permission.java
 * @作者 :cn.loioi
 * @创建时间 :2016年10月13日 下午1:00:08
 */
public enum Permission {

	/**
	 * 查看
	 */
	VIEW("view", "查看"),
	/**
	 * 管理
	 */
	MANAGE("manage", "管理");
	private String identity;
	private String text;

	private Permission(String identity, String text) {
		this.identity = identity;
		this.text = text;
	}

	public String getIdentity() {
		return identity;
	}

	public String getText() {
		return text;
	}

	@Override
	public String toString() {
		return this.identity;
	}

	/**
	 * 多权限转字符串
	 * @param permissions
	 * @return
	 */
	public static String toString(Permission... permissions) {
		return toString(Arrays.asList(permissions));
	}

	public static String toString(List<?> iterable) {
		Set<String> set = new HashSet<>();
		for (Object permission : iterable) {
			if (permission instanceof Permission) {
				set.add(((Permission) permission).identity);
			} else {
				Permission a = parse(String.valueOf(permission));
				set.add(a.identity);
			}
		}
		return StringUtils.join(set, ",");
	}

	/**
	 * 追加权限类型
	 * @param identity
	 * @return
	 */
	public String parts(String identity) {
		return identity + ":" + this.identity;
	}

	/**
	 * 判断 - 是不是当前权限
	 * @param identity
	 * @return
	 */
	public boolean eq(String identity) {
		return this.identity.equals(identity);
	}

	/**
	 * 判断 - 是否包含当前权限
	 * @param identity
	 * @return
	 */
	public boolean has(String identity) {
		if (StringUtils.isEmpty(identity)) {
			return false;
		} else if (eq(identity)) {
			return true;
		} else {
			return identity.indexOf(this.identity) >= 0;
		}
	}

	/**
	 * 将字符串转为枚举
	 * @param identity
	 * @return
	 */
	public static Permission parse(String identity) {
		for (Permission permission : values()) {
			if (permission.eq(identity)) return permission;
		}
		return null;
	}
}
